//package com.springcloud.filter;
//
//import com.netflix.zuul.ZuulFilter;
//import com.netflix.zuul.context.RequestContext;
//import com.netflix.zuul.exception.ZuulException;
//import com.springcloud.jwt.JwtConfigProperty;
//import com.springcloud.jwt.JwtUtil;
//import org.apache.commons.lang.StringUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//import javax.servlet.http.Cookie;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//import java.util.concurrent.TimeUnit;
//
///**
// * 访问后台页面的拦截器
// */
//@Component
//public class AdminFilter extends ZuulFilter {
//
//    private final static Logger LOGGER = LoggerFactory.getLogger(AdminFilter.class);
//
//    @Autowired
//    private JwtConfigProperty jwtConfig;
//    @Autowired
//    private JwtUtil jwtUtil;
//
//    //四种类型：pre,routing,error,post
//    //pre：主要用在路由映射的阶段是寻找路由映射表的
//    //routing:具体的路由转发过滤器是在routing路由器，具体的请求转发的时候会调用
//    //error:一旦前面的过滤器出错了，会调用error过滤器。
//    //post:当routing，error运行完后才会调用该过滤器，是在最后阶段的
//    @Override
//    public String filterType() {
//        return "pre";
//    }
//
//    //自定义过滤器执行的顺序，数值越大越靠后执行，越小就越先执行
//    @Override
//    public int filterOrder() {
//        return 100;
//    }
//
//    //控制过滤器生效不生效，可以在里面写一串逻辑来控制
//    //返回true代表需要权限校验，false代表不需要用户校验即可访问
//    @Override
//    public boolean shouldFilter() {
//        //共享RequestContext，上下文对象
//        RequestContext requestContext = RequestContext.getCurrentContext();
//        HttpServletRequest request = requestContext.getRequest();
//        if("/cms/login".equals(request.getRequestURI()) || "/cms/logout".equals(request.getRequestURI())){
//            return false;
//        }
//        String uri = request.getRequestURI().substring(0, 4);
//
//        //需要权限校验URL
//        if ("/cms".equals(uri)) {
//            return true;
//        }
//        return false;
//    }
//
//    //
//
//    /**
//     * 执行过滤逻辑
//     * 这里只校验jwt是否过期
//     *
//     * @return
//     * @throws ZuulException
//     */
//    @Override
//    public Object run() throws ZuulException {
//        RequestContext requestContext = RequestContext.getCurrentContext();
//
//        validateJwt(requestContext);
//        return null;
//    }
//
//    public void validateJwt(RequestContext requestContext) {
//        HttpServletRequest request = requestContext.getRequest();
//        HttpServletResponse response = requestContext.getResponse();
//        String authHeader = "";
//        Cookie[] cookies = request.getCookies();
//        if (cookies != null) {
//            for (int i = 0; i < cookies.length; i++) {
//                Cookie cookie = cookies[i];
//                if (cookie.getName().equals(jwtConfig.getHeader())) {
//                    authHeader = cookie.getValue();
//                    break;
//                }
//            }
//        }
//        if (StringUtils.isBlank(authHeader)) {
//            authHeader = request.getHeader(jwtConfig.getHeader());//获取浏览器传过来的token信息
//        }
//        String tokenHead = jwtConfig.getTokenHead(); //获取配置文件的token开头
//        if (StringUtils.isNotBlank(authHeader) && authHeader.startsWith(tokenHead)) { //验证token是否为空,验证是否为配置文件的开头
//            String authToken = authHeader.substring(tokenHead.length());//去掉开头
//            try {
//                if (jwtUtil.validateToken(authToken)) { //验证token是否合法
//                    String uri = request.getRequestURI(); // 获取uri
//                    String username = jwtUtil.getSubjectFromToken(authToken); // 获取usernanme
//
//                    String uris = (String) stringRedisTemplate.opsForValue().get(username);
//                    boolean b = false;
//                    if (StringUtils.isNotBlank(uris)) {
//                        String[] uriarr = uris.split(",");
//                        for (String i : uriarr) {
//                            if (uri.equals(i)) {
//                                b = true;
//                                break;
//                            }
//                        }
//                    }
//                    if (b) {
//                        //如果有认证逻辑,或者是延长token时间可以写到这里
//                        String token = jwtUtil.generateToken(username);
//                        response.setHeader(this.jwtConfig.getHeader(), tokenHead + token);//这里比较邪恶,每次访问都返回一个新的token
//                        stringRedisTemplate.opsForValue().set(username, uris, Long.valueOf(expirationMinute) + 1, TimeUnit.MINUTES);
//                    }
//                }
//            }catch (Exception e){
//                setUnauthorizedResponse(requestContext,response);
//            }
//        }else {
//            setUnauthorizedResponse(requestContext,response);
//        }
//    }
//
//    /**
//     * 设置 401 无权限状态
//     */
//    private void setUnauthorizedResponse(RequestContext requestContext,HttpServletResponse response) {
//        requestContext.setSendZuulResponse(false);
////        requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
////
////        Result result = new Result();
////        result.setMsg("401");
////        result.setSuccess(false);
////        requestContext.setResponseBody(result.toString());
//        try {
//            response.sendRedirect("/cms/login");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//}